package cn.cocho.android.mc.num;

import java.math.BigDecimal;

/**
 * 小数取精度
 * 
 * @author HAIKANG SONG
 * @2013年8月1日 @下午3:00:51
 */
public class RoundTool {

	/**
	 * Double类型的数字取精度
	 * 
	 * @param value
	 *            需要取精度的数字
	 * @param scale
	 *            精度的位数
	 * @param roundingMode
	 *            以下为常用的取精度的模式<br>
	 *            BigDecimal.ROUND_HALF_UP:四舍五入<br>
	 *            BigDecimal.ROUND_UP:向上取整<br>
	 *            BigDecimal.ROUND_DOWN:向下取整<br>
	 *            
	 * @return
	 * @author HAIKANG SONG
	 */
	public static double roundDouble(double value, int scale, int roundingMode) {
		BigDecimal bd = new BigDecimal(value);
		bd = bd.setScale(scale, roundingMode);
		double d = bd.doubleValue();
		bd = null;
		return d;
	}

	/**
	 * Float类型的数字取精度
	 * 
	 * @param value
	 *            需要取精度的数字
	 * @param scale
	 *            精度的位数
	 * @param roundingMode
	 *            以下为常用的取精度的模式<br>
	 *            BigDecimal.ROUND_HALF_UP:四舍五入<br>
	 *            BigDecimal.ROUND_UP:向上取整<br>
	 *            BigDecimal.ROUND_DOWN:向下取整<br>
	 *            
	 * @return
	 * @author HAIKANG SONG
	 */
	public static float roundFloat(float value, int scale, int roundingMode) {
		BigDecimal bd = new BigDecimal(value);
		bd = bd.setScale(scale, roundingMode);
		float d = bd.floatValue();
		bd = null;
		return d;
	}

	/**
	 * 测试用的main方法.
	 * 
	 * @param argc
	 *            运行参数.
	 */
	public static void main(String[] argc) {
		// 下面都以保留2位小数为例

		// ROUND_UP
		// 只要第2位后面存在大于0的小数，则第2位就+1
		System.out.println(roundDouble(12.3401, 2, BigDecimal.ROUND_UP));// 12.35
		System.out.println(roundDouble(-12.3401, 2, BigDecimal.ROUND_UP));// -12.35
		// ROUND_DOWN
		// 与ROUND_UP相反
		// 直接舍弃第2位后面的所有小数
		System.out.println(roundDouble(12.349, 2, BigDecimal.ROUND_DOWN));// 12.34
		System.out.println(roundDouble(-12.349, 2, BigDecimal.ROUND_DOWN));// -12.34
		// ROUND_CEILING
		// 如果数字>0 则和ROUND_UP作用一样
		// 如果数字<0 则和ROUND_DOWN作用一样
		System.out.println(roundDouble(12.3401, 2, BigDecimal.ROUND_CEILING));// 12.35
		System.out.println(roundDouble(-12.349, 2, BigDecimal.ROUND_CEILING));// -12.34
		// ROUND_FLOOR
		// 如果数字>0 则和ROUND_DOWN作用一样
		// 如果数字<0 则和ROUND_UP作用一样
		System.out.println(roundDouble(12.349, 2, BigDecimal.ROUND_FLOOR));// 12.34
		System.out.println(roundDouble(-12.3401, 2, BigDecimal.ROUND_FLOOR));// -12.35
		// ROUND_HALF_UP [这种方法最常用]
		// 如果第3位数字>=5,则第2位数字+1
		// 备注:只看第3位数字的值,不会考虑第3位之后的小数的
		System.out.println(roundDouble(12.345, 2, BigDecimal.ROUND_HALF_UP));// 12.35
		System.out.println(roundDouble(12.3449, 2, BigDecimal.ROUND_HALF_UP));// 12.34
		System.out.println(roundDouble(-12.345, 2, BigDecimal.ROUND_HALF_UP));// -12.35
		System.out.println(roundDouble(-12.3449, 2, BigDecimal.ROUND_HALF_UP));// -12.34
		// ROUND_HALF_DOWN
		// 如果第3位数字>=5,则做ROUND_UP
		// 如果第3位数字<5,则做ROUND_DOWN
		System.out.println(roundDouble(12.345, 2, BigDecimal.ROUND_HALF_DOWN));// 12.35
		System.out.println(roundDouble(12.3449, 2, BigDecimal.ROUND_HALF_DOWN));// 12.34
		System.out.println(roundDouble(-12.345, 2, BigDecimal.ROUND_HALF_DOWN));// -12.35
		System.out.println(roundDouble(-12.3449, 2, BigDecimal.ROUND_HALF_DOWN));// -12.34
		// ROUND_HALF_EVEN
		// 如果第3位是偶数,则做ROUND_HALF_DOWN
		// 如果第3位是奇数,则做ROUND_HALF_UP
		System.out.println(roundDouble(12.346, 2, BigDecimal.ROUND_HALF_EVEN));// 12.35
		System.out.println(roundDouble(12.345, 2, BigDecimal.ROUND_HALF_EVEN));// 12.35
	}
}
